home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / ab20 / ab20_archive / utilities / emulators / apple2emul.lzh / vidout.c < prev   
C/C++ Source or Header  |  1991-04-18  |  2KB  |  121 lines

  1. /*
  2.  *  a2, an Apple II emulator in C
  3.  *  (c) Copyright 1990 by Rich Skrenta
  4.  *
  5.  *  Command line interface written by Tom Markson
  6.  *
  7.  *  Distribution agreement:
  8.  *
  9.  *    You may freely copy or redistribute this software, so long
  10.  *    as there is no profit made from its use, sale, trade or
  11.  *    reproduction.  You may not change this copyright notice,
  12.  *    and it must be included prominently in any copy made.
  13.  *
  14.  *  Send emulator related mail to:  skrenta@blekko.commodore.com
  15.  *                    skrenta@blekko.uucp
  16.  */
  17.  
  18.  
  19.  
  20. #include    <stdio.h>
  21. #include    "a2.h"
  22.  
  23.  
  24. #define        WNDLFT        0x20
  25. #define        WNDWDTH        0x21
  26. #define        WNDTOP        0x22
  27. #define        WNDBTM        0x23
  28. #define        CH        0x24
  29. #define        CV        0x25
  30. #define        BASL        0x28
  31. #define        BASH        0x29
  32. #define        BAS2L        0x2A
  33. #define        BAS2H        0x2B
  34.  
  35.  
  36.  
  37. /*
  38.  *  VIDOUT at $FBFD
  39.  */
  40.  
  41. vidout() {
  42. unsigned short ptr;
  43.  
  44.     if (A >= 0xA0 || A < 0x80) {
  45.         ptr = join(mem[BASL], mem[BASH]) + mem[CH];
  46.         set_text1f(ptr, A);
  47.         mem[CH]++;
  48.         if (mem[CH] >= mem[WNDWDTH])
  49.             mem[CH] = 0;
  50.         else {
  51.             DO_RTS;
  52.             return;
  53.         }
  54.     } else if (A == 0x8D)
  55.         mem[CH] = 0;
  56.     else if (A != 0x8A) {
  57.         Pc = 0xFC0C;
  58.         return;
  59.     }
  60.  
  61.     A = ++mem[CV];
  62.     if (A < mem[WNDBTM]) {
  63.         Pc = 0xFC24;
  64.         return;
  65.     }
  66.     mem[CV]--;
  67.  
  68.     scroll();
  69. }
  70.  
  71.  
  72. /*
  73.  *  SCROLL at $FC70
  74.  */
  75.  
  76. scroll() {
  77. int top;
  78. unsigned short bas, bas2, ptr;
  79. int width;
  80. int i;
  81. int scrl2_normal;
  82.  
  83.     if (mem[0x21] == 40 && mem[0x22] == 0 && mem[0x23] == 24) {
  84.         MoveCursor(term_lines, 0);
  85.         putchar('\n');
  86.         last_line = -1;
  87.         last_col = -1;
  88.         fflush(stdout);
  89.         scrl2_normal = FALSE;
  90.     } else
  91.         scrl2_normal = TRUE;
  92.  
  93.     top = mem[WNDTOP];
  94.     width = mem[WNDWDTH] - 1;
  95.     bas = text1[top % 32] + mem[WNDLFT];
  96.  
  97.     while (1) {
  98.         bas2 = bas;
  99.  
  100.         if (++top >= mem[WNDBTM]) {
  101.             mem[BASL] = low(bas);
  102.             mem[BASH] = high(bas);
  103.             Pc = 0xFC95;
  104.             fflush(stdout);
  105.             return;
  106.         }
  107.  
  108.         bas = text1[top % 32] + mem[WNDLFT];
  109.         ptr = bas;
  110.  
  111.         if (scrl2_normal)
  112.             for (i = 0; i <= width; i++)
  113.                 set_text1(bas2++, mem[ptr++]);
  114.         else
  115.             for (i = 0; i <= width; i++)
  116.                 mem[bas2++] = mem[ptr++];
  117.     }
  118. }
  119.  
  120.  
  121.